/*************************************************************************
    > File Name: code.c
    > Author: ma6174
    > Mail: ma6174@163.com 
    > Created Time: Sat 01 Mar 2025 12:04:23 PM CST
 ************************************************************************/
//waitpid的调用方法，WIFEXITED和WEXITSTATUS的使用：用来检查子进程退出状态的宏。
//WIFEXITED返回非零，子进程正常退出，返回零，则子进程退出错误。
//WEXITSTATUS宏来获取子进程的退出码

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

void ChildRun()            //调用子进程
{
	int cnt = 5;
	while(cnt)
	{
		printf("I am child process, pid: %d, ppid: %d,cnt: %d\n",getpid(),getppid(),cnt);
		sleep(1);
		cnt--;
	}
}

int main()
{
	printf("I am father process, pid: %d, ppid: %d\n",getpid(),getppid());

	pid_t id = fork();     //创建子进程
	if(id ==0)
	{
		//运行子进程
		ChildRun();
		printf("child quit...\n");       //调用完子进程，显示一下子进程退出信息
		exit(123);                       //程序直接在这里退出，退出码123
	}
		sleep(10);                     //休眠10s:

	//这里就是父进程的等待信息
	int status = 0;
	pid_t rid = waitpid(id,&status,0);   //填入错误的子进程pid
	if(rid>0)
	{
		//判断子进程是否正常退出并给出退出码信息
		if(WIFEXITED(status))
		{
			printf("child quit success, child exit code: %d\n",WEXITSTATUS(status));   //子进程正常退出，显示退出码	
		}
		else
		{
			printf("child quit unnormal!\n");   //显示子进程异常退出
		}
		printf("wait success, rid: %d\n",rid);   //d等待成功，则输出这行信息
	}
	else
	{
		printf("wait failed!\n");
	}
	sleep(3);
	printf("fatherd quit...\n");     //显示一下父进程退出信息
}
